#include "../inc/button_switch.h"

// ButtonSwitch 构造函数，初始化开关按钮
ButtonSwitch::ButtonSwitch(UI_Object* parent)
{
  // 设置父对象
  this->parent = parent;

  // 创建一个 LVGL 按钮对象，并将其父对象设置为传入的 parent
  this_object = lv_btn_create(parent->get_lv_obj_t());

  // 设置按钮的宽度和高度为主题定义的常量
  this->width = THEME_BUTTON_SWITCH_WIDTH_PRIMARY;
  this->height = THEME_BUTTON_SWITCH_HEIGHT_PRIMARY;

  // 设置 LVGL 按钮对象的高度和宽度
  lv_obj_set_height(this_object, this->height);
  lv_obj_set_width(this_object, this->width);

  // 设置按钮的圆角半径为主题定义的按钮高度
  lv_obj_set_style_radius(this_object, THEME_BUTTON_SWITCH_HEIGHT_PRIMARY, LV_PART_MAIN | LV_STATE_DEFAULT);

  // 设置按钮的背景颜色为主题定义的主颜色
  lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_BUTTON_SWITCH_COLOR_PRIMARY), LV_PART_MAIN | LV_STATE_DEFAULT);

  // 初始化按钮状态为关闭（false）
  this->state = false;

  // 添加按钮点击事件回调函数
  lv_obj_add_event_cb(this->this_object, [](lv_event_t* e) {
    // 获取触发事件的对象
    lv_obj_t* obj = lv_event_get_target(e);

    // 获取用户数据（即 ButtonSwitch 对象的指针）
    void* data = e->user_data;
    ButtonSwitch* sw_btn = (ButtonSwitch*) data;

    sw_btn->state = !sw_btn->state;

    // 根据状态设置 change_t 枚举值
    change_t change = sw_btn->state ? ON : OFF;

    // 调用状态改变回调函数，并传递新的状态和用户数据
    sw_btn->on_state_change_cb(change, sw_btn->user_data);
        // if (sw_btn->state)
    // {
    //   if (sw_btn->on_cb != NULL)
    //   {
    //     sw_btn->set_state(true);
    //     sw_btn->on_cb(e);
    //   }
    // }
    // else {
    //   if (sw_btn->off_cb != NULL)
    //   {
    //     sw_btn->set_state(false);
    //     sw_btn->off_cb(e);
    //   }
    // }
  }, LV_EVENT_CLICKED, this);  // 监听 LV_EVENT_CLICKED 事件，并将 this 作为用户数据传递
}

// ButtonSwitch 析构函数
ButtonSwitch::~ButtonSwitch()
{
  // 析构函数内容为空
}

// 设置按钮的 UI 状态

void ButtonSwitch::set_ui_state(bool state)
{
  // 根据状态设置按钮的背景颜色
  if (state)
  {
    // 如果状态为 true（打开），设置背景颜色为选中颜色
    lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_BUTTON_SWITCH_COLOR_CHOSE), LV_PART_MAIN | LV_STATE_DEFAULT);
  }
  else
  {
    // 如果状态为 false（关闭），设置背景颜色为主颜色
    lv_obj_set_style_bg_color(this_object, lv_color_hex(THEME_BUTTON_SWITCH_COLOR_PRIMARY), LV_PART_MAIN | LV_STATE_DEFAULT);
  }
}

// 设置状态改变时的回调函数
void ButtonSwitch::on_switch_change(ButtonSwitch::on_state_change_cb_t cb, void* user_data)
{
  // 保存用户数据和回调函数
  this->user_data = user_data;
  this->on_state_change_cb = cb;
}

// 设置按钮的图标
void ButtonSwitch::set_icon(const lv_img_dsc_t* icon)
{
  // 设置按钮的背景图片为传入的图标
  lv_obj_set_style_bg_img_src(this_object, icon, LV_PART_MAIN | LV_STATE_DEFAULT);
}